/*
字符串转换工具包，用于进行字符串转换
*/
package encoding
//字符对照表
type LookupTable []rune

/*
字符串转换器接口
*/
type StringConverter interface{
	Encode(src string) string
	Decode(src string) string
}
/*
字符对照表形式实现的字符串转换器
*/
type LookupTableStringConverter struct{
	lookupTable LookupTable
}
func NewLookupTableStringConverter(lookupTable map[rune]rune)*LookupTableStringConverter{
	look1:=[]rune{}
	for k,v:=range lookupTable{
		look1=append(look1,k,v)
	}
	return &LookupTableStringConverter{look1}
}
/*
返回一个凯撒密码字符串转换器实现
*/
func Caesar(offset int)*LookupTableStringConverter{
	lookup:=[]rune{}
	start:=65
	for i:=0;i<=26;i++{
		lookup=append(lookup,rune(i+start),rune((i+offset)%26+start))
	}

	start=97
	for i:=0;i<=26;i++{
		lookup=append(lookup,rune(i+start),rune((i+offset)%26+start))
	}
	return &LookupTableStringConverter{lookup}
}
/*返回一个ROT13的字符串转换器实现
*/
func Rot13() *LookupTableStringConverter{
	return Caesar(13)
}
/*返回一个埃特巴什密码字符串转换器实现
*/
func Atbash() *LookupTableStringConverter{
	str1:=[]rune("abcdefghijklmnopqrstuvwxyz")
	lookup:=[]rune{}
	l:=len(str1)
	for i:=0;i<l;i++{
		lookup=append(lookup,str1[i],str1[l-1-i])
	}
	str2:=[]rune("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
	for i:=0;i<l;i++{
		lookup=append(lookup,str2[i],str2[l-1-i])
	}
	return &LookupTableStringConverter{lookup}
}
func(converter *LookupTableStringConverter) Decode(src string)string{
	dst:=[]rune{}
	for _,v:=range src{
		matched:=false
		for i:=1;i<len(converter.lookupTable);i+=2{
			if converter.lookupTable[i]==v{
				dst=append(dst,converter.lookupTable[i-1])
				matched=true
				break
			}
		}
		if !matched{
			dst=append(dst,v)
		}
	}
	return string(dst)
}

func(converter *LookupTableStringConverter) Encode(src string)string{
	dst:=[]rune{}
	for _,v:=range src{
		matched:=false
		for i:=0;i<len(converter.lookupTable);i+=2{
			if converter.lookupTable[i]==v{
				dst=append(dst,converter.lookupTable[i+1])
				matched=true
				break
			}
		}
		if !matched{
			dst=append(dst,v)
		}
	}
	return string(dst)
}